#include <sys/types.h>
#include <sys/sem.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <linux/msg.h>

#define MAX_RESOURCE 5


union semun {
    int val;
    struct semid_ds *buf;
    unsigned short  *array;
} arg;

int main(int argc, char const *argv[])
{
    key_t key;
    int semid;
    struct sembuf sbuf = {0, -1, IPC_NOWAIT};
    union  semun semopts;

    if ((key = ftok(".", 's')) == -1 ){
        perror("ftok error\n");
        exit(1);
    }

    // 根据ftok产生的key 调用semget创建一个信号量
    if ((semid = semget(key, 1, IPC_CREAT|0666)) == -1) {// 第二个参数表示创建1个信号量
        perror("semget error!\n");
        exit(1);
    }
    semopts.val = MAX_RESOURCE;// 设置信号量资源剩余
    if (semctl (semid, 0, SETVAL, semopts) == -1) {// 设置信号集中第0个
        perror("semctl error!\n");
        exit(1);
    }

    while (1) {
        if (semop(semid, &sbuf, 1) == -1) {// 第三个参数是表示对1个信号量进行操作
            perror("semop error!\n");
            exit(1);
        }
        sleep(3);
    }
    
    return 0;
}
